const http = require('http')
const path = require('path')
const fs = require('fs')
const mime = require('mime') // 用来表示文档、文件或字节流的性质和格式 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types

const server = http.createServer((request, response) => {
  const urlStr = request.url
  const ext = path.parse(urlStr).ext // 获取文件后缀
  const contentType = mime.getType(ext) || 'text/html' // 用后缀来判断服务端响应数据类型

  const file = path.join(__dirname, '/static', urlStr) // 获取请求文件在硬盘中静态资源（static）的物理路径
  const indexHtmlFile = path.join(__dirname, '/static', 'index.html') // 获取index.html在硬盘中静态资源（static）的物理路径
  if (fs.existsSync(file)) { // 判断该文件或文件夹是否存在
    // 判断是文件还是文件夹
    if (fs.statSync(file).isFile()) { // 是文件，则读取并返回该文件
      fs.readFile(file, (err, data) => {
        if (err) {
          console.log(err);
          response.writeHead(404, { 'Content-Type': `${contentType}; charset=utf-8`})
          response.end(err)
        } else {
          response.writeHead(200, { 'Content-Type': `${contentType}; charset=utf-8`})
          response.end(data)
        }
      })
    } else {  // 是文件夹，则默认读取目录下的index.html
      fs.readFile(indexHtmlFile, (err, data) => {
        if (err) {
          console.log(err);
          response.writeHead(404, { 'Content-Type': `${contentType}; charset=utf-8`})
          response.end(err)
        } else {
          response.writeHead(200, { 'Content-Type': `${contentType}; charset=utf-8`})
          response.end(data)
        }
      })
    }
  } else { // url查找的文件或文件夹不存在，响应404
    response.writeHead(404, { 'Content-Type': `${contentType}; charset=utf-8`})
    response.end('file or folder not found.')
  }
})

server.listen(8080, () => {
  console.log('localhost:8080');
})
